<?php
/**
 +---------------------------------<br/>
 * 功能:文件上传相关的事宜方法。<br/>
 +---------------------------------
 * @category mandou
 * @package util.common
 * @author jason
 */
/* * 文件上传类*/

class UtilUpload extends Util{
      private static  $max_size = 10485760;//设置上传文件大小字节
      private static  $file_name = 'date';//重命名方式代表以时间命名，其他则使用给予的名称
      private static  $allow_types;//允许上传的文件扩展名，不同文件类型用“|”隔开
      private static  $errmsg = '';//错误信息
      private static  $uploaded = '';//上传后的文件名(包括文件路径)
      private static  $save_path= 'upload/';//上传文件保存路径
      private static $files;//提交的等待上传文件
      private static $file_type = array();//文件类型
      private static $ext = '';//上传文件扩展名


      /**
       * 构造函数，初始化类
       * @access public
       * @param string $file_name 上传后的文件名
       * @param string $save_path 上传的目标文件夹
       */
      public function __construct($save_path,$file_name,$allow_types,$max_size){
          if($save_path)self::$save_path=$save_path;
          if($file_name)self::$file_name=$file_name;
          if($allow_types)self::$allow_types=$allow_types;
          if($max_size)self::$max_size=$max_size;
      }

      /**
       * 上传文件
       * @access public
       * @param $files 等待上传的文件(表单传来的$_FILES[])
       * @return boolean 返回布尔值
       */
     public function upload_file($files) {
          $name = $files['name'];
          $type = $files['type'];
          $size = $files['size'];
          $tmp_name = $files['tmp_name'];
          $error = $files['error'];
          switch ($error) {
               case 0 : self::$errmsg = '';
                break;
               case 1 : self::$errmsg = '附件超过了10M';
                break;
               case 2 : self::$errmsg = '附件超过了10M';
                break;
               case 3 : self::$errmsg = '文件只有部分被上传';
                break;
               case 4 : self::$errmsg = '没有文件被上传';
                break;
               case 5 : self::$errmsg = '上传文件大小为0';
                break;
               default : self::$errmsg = '上传文件失败！';
                break;
           }
          if($error == 0 && is_uploaded_file($tmp_name)) {
               // //检测文件类型
               // if(self::check_file_type($name) == FALSE){
               //      return FALSE;
               // }
               //检测文件大小
               if($size > self::$max_size){
                    self::$errmsg = '上传文件'.$name.'太大，最大支持'.ceil(self::$max_size/1024).'kb的文件';
                    return $data = array("success"=>"failure","data"=>self::$errmsg);
                }
               self::set_save_path();//设置文件存放路径
               self::check_file_type($name);
               $new_name = self::$file_name != 'date' ? self::$file_name.'.'.self::$ext : date('YmdHis').'.'.self::$ext;//设置新文件名
               self::$uploaded = self::$save_path.$new_name;//上传后的文件名
               //移动文件
               if(move_uploaded_file($tmp_name,self::$uploaded)){
                    return $data = array("success"=>"success","data"=>self::$uploaded,"name"=>$name);
               }else{
                    self::$errmsg = '文件<font color=red>'.self::$uploaded.'</font>上传失败！';
                    return $data = array("success"=>"failure","data"=>self::$errmsg);
               }
          }elseif ($error == 4) {
            return $data = array("success"=>"success","data"=>self::$uploaded,"name"=>$name);
          }
          if(self::$errmsg==""){
              self::$errmsg = '上传文件'.$name.'太大，最大支持'.ceil(self::$max_size/1024).'kb的文件';
          }
          return $data = array("success"=>"failure","data"=>self::$errmsg,"e"=>$error);
          
    }

    /**
    * 检查上传文件类型
    * @access public
    * @param string $filename 等待检查的文件名
    * @return 如果检查通过返回TRUE 未通过则返回FALSE和错误消息
    */
    public function check_file_type($filename){
        $ext = self::get_file_type($filename);
        self::$ext = $ext;
        $allow_types = explode('|',self::$allow_types);//分割允许上传的文件扩展名为数组
        //echo $ext;
        //检查上传文件扩展名是否在请允许上传的文件扩展名中
        if(in_array($ext,$allow_types)){
            return TRUE;
        }else{
            self::$errmsg = '上传文件<font color=red>'.$filename.'</font>类型错误，只支持上传<font color=red>'.str_replace('|',',',self::$allow_types).'</font> 等文件类型!';
            return FALSE;
        }
    }

    /**
    * 取得文件类型
    * @access public
    * @param string $filename 要取得文件类型的目标文件名
    * @return string 文件类型
    */
    public function get_file_type($filename){
         $info = pathinfo($filename);
         $ext = $info['extension'];
         return $ext;
    }

    /**
    * 设置文件上传后的保存路径
    */
    public function set_save_path(){
          // self::$save_path = (preg_match('//$\/',self::$save_path))?self::$save_path : self::$save_path . '/';
          if(!is_dir(self::$save_path)){
               //如果目录不存在，创建目录
               self::set_dir();
          }
    }


     /**
      * 创建目录
      * @access public
      * @param string $dir 要创建目录的路径
      * @return boolean 失败时返回错误消息和FALSE
      */
     public function set_dir($dir = null){
          //检查路径是否存在
          if(!$dir){
            $dir = self::$save_path;
          }
          if(is_dir($dir)){
            self::$errmsg = '需要创建的文件夹已经存在！';
          }
          $dir = explode('/', $dir);
          $d = "";
          foreach($dir as $v){
               if($v){
                    $d .= $v . '/';
                    if(!is_dir($d)){
                         $state = mkdir($d, 0777);
                         if(!$state)
                            self::$errmsg = '在创建目录<font color=red>' . $d . '时出错！';
                    }
               }
          }
          return true;
     }
}

?>